商品検出モデルを開発するために、箱物を作った話
概要
こんにちは、yoshimです。
10/15(金)に実施した「cmdevio2018」では、「商品検出モデル」を利用したプロダクトを、DI部の3名で協力して開発しました。
実際に開発したプロダクトは下記の画像の通りで、「左手にある白いトレー上に置いた商品を検出してディスプレイに結果を表示する」というものです。
ディスプレイには下記のように「どの商品か」、「確信度」が表示されます。
(違う商品で試した画像ですが...)
このプロダクトではSageMakerの組み込みアルゴリズムの1つである「物体検出アルゴリズム」を利用し、エッジ(Jetson TX2)で処理を完結させています。
今回この開発工程で、「どのような画像をどのように撮影するか」といった部分を担当したので、その部分についてご紹介します。
目次
1.画像取得するにあたって考慮したこと
画像認識系をやるにあたって、「どのように教師画像を取得するのか」といった点は十分な考慮が必要となります。例えば、今回は開発業務をオフィスでやりつつ、最終的なdemoは別会場で実施するので「オフィスでのモデルの精度はいいものの、demo会場では精度が悪い」といった事態が発生することを危惧していました。
上記の事象を避けるべく、下記の2点を注意しました。
・光の当たり具合は均一か
・画像の背景は均一か
今回は「オフィス、demo会場のいずれでも同じような画像が取得できる」環境(以下、箱物)を用意することで対応したのですが、もう少し詳細について記述していこうと思います。
・箱物の画像
2.光の当たり具合は均一か
画像分類をするに当たって、「商品への光の当たり具合」は注意が必要な部分です。
というのも、例えば下記の2枚は同じ商品の画像なのですが、光の当たり具合が異なります。
人間が見れば同じ商品だとわかるのですが、機械学習のモデルだと「別の商品」と識別してしまう可能性があるので、光の当たり具合を安定化する必要があります。
この時、モデルの汎化性能を向上することでもある程度は対応できるかとも思ったのですが、それよりも「画像を取得する環境」を整えてあげた方が現実的だと考えました。
そこで今回用意した箱物では半透明なシートを使い周囲を囲むことで、光の当たり具合を均一化させました。
また、箱物の「天井部分」にも、この半透明のシートを利用しています。
3.画像の背景は均一か
当日demo会場でレンタルする机がどうなるのかもわからなかったので、商品検出推論時の「画像背景の影響」を抑えるべく「底面に敷いた白いプレートの上に商品を置く」ようにしました。
(画像の背景が原因でうまく分類できなかったこともあったので...)
教師画像を増やして汎化性能を向上させることも考えたのですが、それだと商品を増やすたびに「手間がかかりすぎて現実的でない」と考えたのでこのような対応としました。
・プレートを敷いていない状態での画像
4.取得画像枚数を減らすこと
最後に、今回のプロダクトではモデル生成のコスト削減をするために「いかに教師画像の枚数を減らせるか」という点にもチャレンジしました。
以下、本プロダクトのモデル生成に関するエントリーからの引用です。
精度と引き換えにはなった可能性がありますが、オリジナルの教師データが372枚から60枚と約6分の1まで減ったため、アノテーションはかなり楽になりました。検出対象が1種類増えるだけで数十枚から数百枚の画像が新たに必要だと、撮影やアノテーションにかなりコストがかかることになります。しかしながら、商品検出の用途によっては、商品の側面であったり、角の部分であったりと様々な角度からも認識ができる必要が出て来るため、それだけのパターンの教師画像も必要になります。コストを掛けてでも認識能力が必要か、認識能力を制限した上でコストと速さを優先するかなど、用途を検討した上で考える必要がありそうです。
今回は「商品の表面、裏面のみを対象とする」、「白いプレートの上に商品をのせる」といった制約はつきましたが、6種類の商品を分類するために必要な画像枚数としてはかなり少なくできました。
ただ、今回利用した商品は「どの商品も同じような見た目」だったのである程度上手くいったのですが、もし他の商品を利用していたら、今回の手法では上手くいかなかったかもしれません。
5.まとめ
先日、実施した「cmdevio2018」で披露したプロダクトで、「物体検出モデル」を稼働させるために「箱物」を作ったお話でした。
機械学習を用いたプロダクトを開発する際は、「エッジでどのようにデータを取得するか」、といった点も重要かと思いますが、どなたかの参考になれば幸いです。